#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include "Estructuras.h"
#include "logging.c"

unsigned char centroMensajes;
int pararEjecucion;
int descriptorDisco;
char * config = "config.txt";
char * pathDisco = "disco.txt";
char * pathArchivoLogueo = "archivoLogueo.txt";

//semaforos thread
sem_t semaforo1;
sem_t semaforo2;

/*pthread_mutex_t buffer_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t buffer_lock2 = PTHREAD_MUTEX_INITIALIZER;*/

//loggeo
FILE * archivoLogueo;
int descriptorArchivo;
const char * nombreDelProceso = "PPD";
unsigned char nivelDeLog = LOG_INFO;


//datos de configuracion
int modoInicio = 1; //0 connect 1 listen
char Algoritmo[10];
char pathSocketUnix[30];
int FlagLog; //0 desactivado 1 activado
char IdDisco;
// puto el que (no) lee : char * pathDisco;
long cantSecPorPista;
long cantidadPistas;
int cantidadCabezales;
int T_Lectura;
int T_Escritura;
int T_SaltoSector;
int T_SaltoPista;
int RPM;

t_chs CHS;
t_nodo * colaFte;
t_nodo * colaFin;
char * Disco;
long tamanoDisco;



#include "mtlib.c"
#include "Conexiones.c"
#include "FuncionesAuxiliares.c"
#include "LeerEscribirSector.c"
#include "logueoPPD.c"
#include "FuncionesTrace.c"
#include "Procesar.c"



int main(void) {

	sem_init(&semaforo1, 0 , 1);
	sem_init(&semaforo2, 0 , 1);
    	unsigned int descriptor_conexion,conexion_con_consola;
    	pthread_t hiloProcesarCola;
    	int ret;

        centroMensajes = mtf_obtener_descriptor(1024);
        conexion_con_consola = mtf_conectar(centroMensajes, MTP_UNIX,"archivoConexion" );


    if (fork() == 0){
       // execl("consola",NULL);
    }
    else{
        
        descriptor_conexion = conectar();
        pararEjecucion = 0;
        


        //Carga la configuaracion del sistema
        leerArchivoConfiguracion(config);

        fclose(fopen(pathArchivoLogueo, "w"));
        inicializarCHS();
        incializarCola();


        //Mapea el disco a memoria
        Disco = (char *)AbreDiscoEnMemoria(pathDisco);

        ret  = pthread_create(&hiloProcesarCola,NULL,(void *)procesarColaDeSectores,NULL);
        while (!pararEjecucion) {

                int cantMensajes;
                cantMensajes = mtf_recibir_mensajes(centroMensajes);

                if (cantMensajes) {
                        mti_mensaje datosMensaje;

                        datosMensaje = mtf_siguiente_mensaje(centroMensajes);

                        procesarMensaje(datosMensaje);

                        mtf_descartar_mensaje(centroMensajes, datosMensaje.codigo);
                }
        }

        mtf_liberar_descriptor(centroMensajes);
        munmap(Disco, tamanoDisco);
    }

    sem_destroy(&semaforo1);
    sem_destroy(&semaforo2);
    return 0;
}
